关键字POI搜索 Sample详情

最后更新时间:2020年12月15日

POI查询的关键字搜索方式,即根据用户输入的关键字、选择的类型进行模糊查询,搜索满足条件的POI信息点,可以通过标注、绘制或者列表方式展示查询到的兴趣点。

在进行POI查询之前,需准备POI数据,详细步骤参考POI数据组织模块,在此不赘述,接下来讲解具体的关键字搜索的编码实现方法。

1

POI查询对象准备

首先,创建并初始化POI查询对象,设置POI数据。

    // 创建POI查询对象
    PoiSearch mPoiSearch = new PoiSearch();
    //为POI查询对象设置配置好的.db数据,并以此来初始化
    mPoiSearch.initWithDBPath(Environment.getExternalStorageDirectory().getPath()+"/MapGISSample/POI/WuHanPOI.db");
    //设置查询每页的结果数目
    mPoiSearch.setPageSize(40);

2

设置查询条件

进行关键字POI搜索,需要在查询之前设置条件,首先构造查询条件对象PoiSearch.Query,然后利用其接口设置查询的关键字、查询的POI类型。

    // 设置POI查询条件:关键字与POI信息类型
    PoiSearch.Query mQuery = new PoiSearch.Query("武汉", PoiTypeDef.TouristAttraction, null);
    mPoiSearch.setQuery(mQuery);

代码说明:PoiSearch.Query的第一个参数为查询关键字的字符串;第二个参数为POI类型的组合,例如为景点类型(PoiTypeDef.TouristAttraction),也可定义组合(如餐馆 + 电影院 + 景点);第三个参数为设置查询POI的城市。

SDK中提供的POI具体分类如下表所示,代码中由com.zondy.mapgis.poisearch.PoiTypeDef的字段提供,用户可以根据自己需要选择,在实际项目应用中,可以将这些类型以列表或其他形式展示给终端用户,从而让用户自行选择类型。

POI一级分类 POI二级分类 PoiTypeDef字段
所有POI类型 类型的全集 All
住宿服务 宾馆 Accommodation
汽车服务 加油站 AutoCarService
科教文化 学校 Education
餐饮服务 中餐厅 FoodBeverages
体育休闲服务 娱乐场所,网吧 InternetBar
医疗相关服务 综合医院 MedicalService
公共设施 公共厕所 PublicService
交通设施服务 停车场 PublicParkingLot
地铁站 PublicSubway
公交车站 PublicTransportation
购物中心 商场 Shopping
超市 SuperMarket
风景名胜 景点 TouristAttraction

3

查询与结果展示

查询POI,遍历查询结果,并以文本图形、标注形式展示,核心代码如下:

//查询并返回结果
PoiPagedResult searchPoiResult = mPoiSearch.searchPOI();
//判断是否查询到了结果
if (searchPoiResult != null && searchPoiResult.getTotalPOICount() > 0) {
    //遍历所有页
    for (int i = 1; i <= searchPoiResult.getPageCount(); i++) {
        List<PoiItem> poiItemList = searchPoiResult.getPage(i); //获取每一页的结果集,从1开始
        for (int j = 0; j < poiItemList.size(); j++) {//遍历每一页的结果项
            //获取POI项
            PoiItem poiItem = poiItemList.get(j);
            //获取POI点信息:坐标、名称、地址、电话
            Dot point = poiItem.getPoint();
            String name = poiItem.getName();
            String address = poiItem.getAddress();
            String phoneNum = poiItem.getTel();
        }
    }
    mapView.refresh();   //地图刷新
} else {
    Toast.makeText(this, "查询结果为空", Toast.LENGTH_SHORT).show();
}

查询到POI结果后,可以通过文本图形、地图标注进行展示:

     // 获取标注图标
     bmp = BitmapFactory.decodeResource(getResources(), R.drawable.location);

    // 创建文本,添加到绘图层
    GraphicText pointText = new GraphicText();
    pointText.setPoint(PointTransferUtil.Lonlat2Mercator(point));//坐标点
    pointText.setText(name);//文本
    pointText.setFontSize(38);//文字大小
    pointText.setReferenceInfo(10, 15, 2, new PointF(15, 3));//锚点
    mapView.getGraphicsOverlay().addGraphic(pointText);

    // 创建annotation,添加到标注层
    Annotation annotationPOI = new Annotation(name, address, PointTransferUtil.Lonlat2Mercator(point), bmp);
    annotationPOI.setCanShowAnnotationView(true);
    mapView.getAnnotationsOverlay().addAnnotation(annotationPOI);

展示效果如下图所示:

关键字POI搜索.jpg